package com.rongmei.jdsync.service;

import com.rongmei.jdsync.dto.PriceChangeDto;
import com.rongmei.jdsync.dto.sync.BatchProcessResult;
import com.rongmei.jdsync.dto.sync.PriceSyncResult;
import com.rongmei.jdsync.dto.sync.PushResult;
import com.rongmei.jdsync.dto.sync.RetryResult;
import com.rongmei.jdsync.dto.sync.SyncOptions;
import com.rongmei.jdsync.entity.Goods;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 价格同步服务接口
 * 提供商品价格同步相关的核心功能
 *
 * @author dongjun
 */
public interface PriceSyncService {

    /**
     * 执行完整的价格同步任务
     * 包括获取商品列表、价格比对、推送变更等完整流程
     *
     * @return 同步结果统计信息
     * @throws RuntimeException 当同步过程中发生不可恢复的错误时
     */
    PriceSyncResult executePriceSync();

    /**
     * 执行价格同步任务（带参数）
     * 支持自定义同步参数的价格同步
     *
     * @param syncOptions 同步选项配置
     * @return 同步结果统计信息
     */
    PriceSyncResult executePriceSync(SyncOptions syncOptions);


    /**
     * 批量查询本地商品信息
     * 根据商品ID列表批量查询本地数据库中的商品信息
     *
     * @param goodsIds 商品ID列表，不能为null
     * @return 商品信息列表，找不到的商品不会包含在结果中
     * @throws IllegalArgumentException 当goodsIds为null时
     */
    List<Goods> getLocalGoodsByIds(List<Long> goodsIds);

    /**
     * 获取京东商品信息映射
     * 从京东API获取指定商品的最新信息
     *
     * @param goodsIds 需要获取的商品ID列表
     * @return 商品ID到商品信息的映射
     */
    Map<Long, Goods> getJdGoodsMap(List<Long> goodsIds);

    /**
     * 比较价格差异
     * 对比本地商品价格和京东最新价格，找出有变更的商品
     *
     * @param localGoods 本地商品列表
     * @param jdGoodsMap 京东商品映射
     * @param threshold 价格变更阈值，小于此值的变更将被忽略
     * @return 价格变更列表
     */
    List<PriceChangeDto> comparePrices(List<Goods> localGoods, Map<Long, Goods> jdGoodsMap, BigDecimal threshold);

    /**
     * 批量推送价格变更到第三方系统
     * 将价格变更信息推送到第三方系统进行更新
     *
     * @param priceChanges 价格变更列表
     * @param syncBatchId 同步批次ID
     * @return 推送结果统计
     */
    PushResult pushPriceChanges(List<PriceChangeDto> priceChanges, String syncBatchId);

    /**
     * 更新本地商品价格
     * 将成功推送的价格变更更新到本地数据库
     *
     * @param priceChanges 价格变更列表
     * @throws RuntimeException 当更新过程中发生错误时
     */
    void updateLocalPrices(List<PriceChangeDto> priceChanges);

    /**
     * 重试失败的同步记录
     * 重新处理之前同步失败的商品
     *
     * @param maxRetryCount 最大重试次数
     * @return 重试结果
     */
    RetryResult retryFailedSync(int maxRetryCount);

    /**
     * 处理单个批次的数据
     * 每个批次作为一个独立的事务，确保数据一致性
     *
     * @param goodsIds 商品ID列表
     * @param syncBatchId 同步批次ID
     * @param syncOptions 同步选项
     * @return 批次处理结果
     */
    BatchProcessResult processBatch(List<Long> goodsIds, String syncBatchId, SyncOptions syncOptions);
}
